package _20250305;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class MyThread5 {
    /**
     *  题目：使用 Java 并发包中的CyclicBarrier实现一个多线程程序。
     *  假设有 5 个运动员线程进行跑步比赛，所有运动员到达起跑线
     * 调用CyclicBarrier的await方法）后，比赛才开始（所有线程同时继续执行后续代码），
     * 当有任意一个运动员跑完比赛（通过某个条件判断），通知其他运动员停止比赛。
     */
    private static volatile boolean finished = false;
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
            System.out.println("所有运动员到达起跑线");
            System.out.println("比赛开始");

        });
        for (int i = 0; i <5; i++) {
            new Thread(new Worker(cyclicBarrier,"运动员"+(i+1))).start();
        }
    }

     static class Worker implements Runnable {
        private final CyclicBarrier cyclicBarrier;
         private final String name;
         /**
          * 跑道长度
          */
         private final int runwayLength=200;

         private static int[] now=new int[100];
        public Worker(CyclicBarrier cyclicBarrier, String name) {
            this.cyclicBarrier=cyclicBarrier;
            this.name=name;
        }
        @Override
        public void run() {
            Random random = new Random();
            int ran=0;
            try {
                System.out.println(name+"准备完毕");
                cyclicBarrier.await();
                for (int distance = 0; distance < runwayLength; ) {
                    if(finished){
                        System.out.println("比赛结束");
                        return;
                    }
                        ran=random.nextInt(3);
                        distance+=ran;
                        System.out.println(name+":"+distance);
                        Thread.sleep(100);
                    if (distance>=runwayLength){
                        finished=true;
                        System.out.println("比赛结束,"+name+",获得了第一");
                        cyclicBarrier.reset();
                        return;
                    }
                }

            } catch (InterruptedException|BrokenBarrierException e) {
                throw new RuntimeException(e);
            }
        }

     }
}
